home *** CD-ROM | disk | FTP | other *** search
- /* An XFun to create slider bar controls.
-
- This is not a particularly good choice for an XFun source example because it contains
- complications unrelated to the XFun interface. It does, however, show some tricks used
- to manage interaction with MathPad. Also, it provides full source for an XFun that I
- suspect others may want to modify.
-
- */
-
- #include "callbackg.h"
- #include "sliders.h"
-
- SliderPtr sliders; // list of all sliders
- ControlActionUPP scroller; // universal proc ptr for PowerPC compatability
-
- static SliderPtr NewSlider(char *name)
- {
- Rect BarRect;
- SliderPtr slider;
- int top,left,len;
- unsigned char title[64],*dst;
- Point org = { 0,0 };
- WindowPtr wind,twind;
- GrafPtr oldport;
-
- twind = FrontWindow(); // normally text window is front during eval
- GetPort(&oldport);
- if(sliders) // put new slider under the last slider
- {
- SetPort(sliders->wind);
- LocalToGlobal(&org);
- top = org.v + 36;
- left = org.h;
- }
- else // put 1st slider under text window
- {
- SetPort(twind);
- org.v = twind->portRect.bottom;
- LocalToGlobal(&org);
- top = org.v + 20;
- left = org.h;
- }
- SetPort(oldport);
-
- slider = (SliderPtr)NewPtr(sizeof(struct sliderinfo));
- if(!slider) return(NULL);
-
- dst = &title[1];
- for(len=0; len<63; len++)
- if((*dst++ = *name++) == 0) break;
- title[0] = len;
-
- SetRect(&BarRect,left,top,left+216,top+16);
- wind = NewWindow(NULL,&BarRect,title,0,noGrowDocProc,(WindowPtr)-1,TRUE,0L);
- if(!wind) return(NULL);
-
- BarRect = wind->portRect;
- slider->ctrl = NewControl(wind,&BarRect,0L,TRUE,500,0,1000,scrollBarProc,0L);
- slider->next = sliders;
- sliders = slider;
- slider->wind = wind;
- SelectWindow(twind);
- return(slider);
- }
-
- static int matchname(char *name,unsigned char *title)
- {
- int c,len;
- len = *title++;
- while((c=*name++) && c == *title++) len--;
- return(c == 0 && len == 0);
- }
-
- static SliderPtr FindSlider(char *name)
- {
- Str255 title;
- SliderPtr list;
- list = sliders;
- while(list)
- {
- GetWTitle(list->wind,title);
- if(matchname(name,title)) return(list);
- list = list->next;
- }
- return(NULL);
- }
-
- /* --------------------------------------------------------- */
- void initialize(void)
- {
- sliders = 0L;
- scroller = NewControlActionProc(ScrollProc);
- }
-
- int IsSlider(WindowPtr theWindow)
- {
- SliderPtr list;
- list = sliders;
- while(list)
- {
- if(list->wind == theWindow) return(TRUE);
- list = list->next;
- }
- return(FALSE);
- }
-
- void activate(void)
- {
- SliderPtr list;
- list = sliders;
- while(list)
- {
- ShowControl(list->ctrl);
- list = list->next;
- }
- }
-
- void deactivate(void)
- {
- SliderPtr list;
- list = sliders;
- while(list)
- {
- HideControl(list->ctrl);
- list = list->next;
- }
- }
-
- short dofuncall(double *retval)
- {
- char *name;
- double min,max;
- SliderPtr slider;
- WindowPtr wind;
- char buf[10];
-
- if(!GetParmName(2,&name))
- {
- if(!GetParmVal(2,&min)) return(FALSE); // can't get name. try number
- Sprintf(buf,"c%0.3g",min);
- name = buf;
- }
- if(!GetParmVal(1,&min)) return(FALSE);
- if(!GetParmVal(0,&max)) return(FALSE);
- slider = FindSlider(name);
- if(!slider) slider = NewSlider(name);
- if(!slider)
- {
- ErrMsg(" Not enough memory",0L);
- return(FALSE);
- }
- wind = slider->wind;
- ShowWindow(wind);
- if(EmptyRgn(wind->visRgn)) SelectWindow(wind); // if covered bring it to front
- if(EmptyRgn(wind->visRgn)) MoveWindow(wind,250,42,FALSE); // if off screen move it
-
- *retval = (max-min)*GetCtlValue(slider->ctrl)/1000.0 + min;
- return(TRUE);
- }
-
- void KillSlider(WindowPtr theWindow)
- {
- SliderPtr list,prev;
- list = sliders;
- prev = NULL;
- while(list)
- {
- if(list->wind == theWindow)
- {
- DisposeWindow(theWindow);
- if(prev) prev->next = list->next;
- else sliders = list->next;
- DisposePtr((Ptr)list);
- break;
- }
- prev = list;
- list = list->next;
- }
- }
-
- void KillAllSliders(void)
- {
- SliderPtr next;
- while(sliders)
- {
- DisposeWindow(sliders->wind);
- next = sliders->next;
- DisposePtr((Ptr)sliders);
- sliders = next;
- }
- }
-